pacman::p_load(
  tidyverse,
  here,
  RColorBrewer,
  lubridate,
  scales,
  GGally,
  stats,
  corrplot,
  mice,
  VIM
)
flights_dt <- read_csv(here("clean_data/flights_clean.csv"))
Rows: 327346 Columns: 38
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (11): origin, origin_name, dest, dest_name, carrier, carrier_name, tailnum, manufacturer, model, engine, type
dbl  (22): dep_delay, arr_delay, air_time, distance, flight, engines, seats, aircraft_age, lat, lon, alt, wind_di...
dttm  (5): dep_time, sched_dep_time, arr_time, sched_arr_time, time_hour

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000")

summary(flights_dt)
    dep_time                   sched_dep_time                  dep_delay          origin          origin_name       
 Min.   :2013-01-01 05:17:00   Min.   :2013-01-01 05:15:00   Min.   : -43.00   Length:327346      Length:327346     
 1st Qu.:2013-04-05 05:56:00   1st Qu.:2013-04-05 06:00:00   1st Qu.:  -5.00   Class :character   Class :character  
 Median :2013-07-04 09:52:30   Median :2013-07-04 09:54:30   Median :  -2.00   Mode  :character   Mode  :character  
 Mean   :2013-07-03 18:10:05   Mean   :2013-07-03 18:02:48   Mean   :  12.56                                        
 3rd Qu.:2013-10-01 18:12:45   3rd Qu.:2013-10-01 18:14:45   3rd Qu.:  11.00                                        
 Max.   :2013-12-31 23:56:00   Max.   :2013-12-31 23:59:00   Max.   :1301.00                                        
                                                                                                                    
    arr_time                   sched_arr_time                  arr_delay            dest          
 Min.   :2013-01-01 00:03:00   Min.   :2013-01-01 00:05:00   Min.   : -86.000   Length:327346     
 1st Qu.:2013-04-05 01:03:00   1st Qu.:2013-04-05 03:43:30   1st Qu.: -17.000   Class :character  
 Median :2013-07-04 11:36:30   Median :2013-07-04 11:55:30   Median :  -5.000   Mode  :character  
 Mean   :2013-07-03 19:41:02   Mean   :2013-07-03 19:59:24   Mean   :   6.895                     
 3rd Qu.:2013-10-01 20:07:00   3rd Qu.:2013-10-01 20:20:30   3rd Qu.:  14.000                     
 Max.   :2014-01-01 00:00:00   Max.   :2013-12-31 23:59:00   Max.   :1272.000                     
                                                                                                  
  dest_name            air_time        distance        flight       carrier          carrier_name      
 Length:327346      Min.   : 20.0   Min.   :  80   Min.   :   1   Length:327346      Length:327346     
 Class :character   1st Qu.: 82.0   1st Qu.: 509   1st Qu.: 544   Class :character   Class :character  
 Mode  :character   Median :129.0   Median : 888   Median :1467   Mode  :character   Mode  :character  
                    Mean   :150.7   Mean   :1048   Mean   :1943                                        
                    3rd Qu.:192.0   3rd Qu.:1389   3rd Qu.:3412                                        
                    Max.   :695.0   Max.   :4983   Max.   :8500                                        
                                                                                                       
   tailnum          manufacturer          model              engines          seats          engine         
 Length:327346      Length:327346      Length:327346      Min.   :1.00    Min.   :  2.0   Length:327346     
 Class :character   Class :character   Class :character   1st Qu.:2.00    1st Qu.: 55.0   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Median :2.00    Median :149.0   Mode  :character  
                                                          Mean   :1.99    Mean   :137.5                     
                                                          3rd Qu.:2.00    3rd Qu.:189.0                     
                                                          Max.   :4.00    Max.   :450.0                     
                                                          NA's   :48329   NA's   :48329                     
  aircraft_age        lat             lon               alt           time_hour                      wind_dir    
 Min.   : 8.00   Min.   :21.32   Min.   :-157.92   Min.   :   3.0   Min.   :2013-01-01 10:00:00   Min.   :  0.0  
 1st Qu.:15.00   1st Qu.:32.90   1st Qu.: -95.34   1st Qu.:  26.0   1st Qu.:2013-04-05 10:00:00   1st Qu.:130.0  
 Median :19.00   Median :36.08   Median : -83.99   Median : 433.0   Median :2013-07-04 13:00:00   Median :220.0  
 Mean   :19.59   Mean   :35.97   Mean   : -89.61   Mean   : 583.8   Mean   :2013-07-03 21:56:45   Mean   :201.9  
 3rd Qu.:22.00   3rd Qu.:41.41   3rd Qu.: -80.15   3rd Qu.: 748.0   3rd Qu.:2013-10-01 22:00:00   3rd Qu.:290.0  
 Max.   :65.00   Max.   :61.17   Max.   : -68.83   Max.   :6602.0   Max.   :2014-01-01 04:00:00   Max.   :360.0  
 NA's   :53493   NA's   :7537    NA's   :7537      NA's   :7537                                   NA's   :9574   
     humid             hour           minute           year           type                temp       
 Min.   : 12.74   Min.   : 5.00   Min.   : 0.00   Min.   :1956    Length:327346      Min.   : 10.94  
 1st Qu.: 43.74   1st Qu.: 9.00   1st Qu.: 8.00   1st Qu.:1999    Class :character   1st Qu.: 42.08  
 Median : 57.22   Median :13.00   Median :29.00   Median :2002    Mode  :character   Median : 57.20  
 Mean   : 59.21   Mean   :13.14   Mean   :26.23   Mean   :2001                       Mean   : 57.01  
 3rd Qu.: 74.67   3rd Qu.:17.00   3rd Qu.:44.00   3rd Qu.:2006                       3rd Qu.: 71.96  
 Max.   :100.00   Max.   :23.00   Max.   :59.00   Max.   :2013                       Max.   :100.04  
 NA's   :1544                                     NA's   :53493                      NA's   :1544    
      dewp         wind_speed         precip          pressure          visib      
 Min.   :-9.94   Min.   : 0.000   Min.   :0.0000   Min.   : 983.8   Min.   : 0.00  
 1st Qu.:26.06   1st Qu.: 6.905   1st Qu.:0.0000   1st Qu.:1012.9   1st Qu.:10.00  
 Median :42.80   Median :10.357   Median :0.0000   Median :1017.6   Median :10.00  
 Mean   :41.50   Mean   :11.060   Mean   :0.0042   Mean   :1017.9   Mean   : 9.29  
 3rd Qu.:57.92   3rd Qu.:14.960   3rd Qu.:0.0000   3rd Qu.:1022.9   3rd Qu.:10.00  
 Max.   :78.08   Max.   :42.579   Max.   :1.2100   Max.   :1042.1   Max.   :10.00  
 NA's   :1544    NA's   :1605     NA's   :1527     NA's   :36142    NA's   :1527   

Which airport in our dataset has the highest number of departures?

What is the trend of delays over the year, how does it compare across the three airports?

flights_dt %>% 
  filter(dep_delay >= 15) %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(mean_delay = mean(dep_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = month, y = mean_delay, colour = origin) +
  geom_line(alpha = 0.6) +
  geom_point(alpha = 0.8) +
  labs(
    x = "month",
    y = "mean departure delay (minutes)",
    title = " Mean delay by month",
    colour = "airport"
  ) +
  scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
  theme_bw()

Which months have the highest and lowest mean departure delays?

# highest mean departure delay by month
flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(mean_delay = mean(dep_delay), .groups = "drop") %>% 
  arrange(desc(mean_delay))
# lowest departure delay by month
flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(mean_delay = mean(dep_delay), .groups = "drop") %>% 
  arrange(mean_delay)

What is the number of delayed flights over the year?

flights_dt %>%
  filter(dep_delay >= 15) %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(no_of_delays = n(), .groups = "drop") %>% 
  ggplot() +
  aes(x = month, y = no_of_delays, colour = origin) +
  geom_line(alpha = 0.6) +
  geom_point(alpha = 0.8) +
  labs(
    x = "month",
    y = "number of delays",
    title = "Number of delayed flights by month",
    colour = "airport"
  ) +
  scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
  theme_bw()

Which month has the highest number of delays?

flights_dt %>%
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(month = floor_date(sched_dep_time, "month"), origin) %>% 
  summarise(no_of_delays = n(), .groups = "drop") %>% 
  arrange(desc(no_of_delays))

What were the weather conditions during these months?

flights_dt %>% 
  mutate(date = as.Date(dep_time, label = TRUE),
         month = month(dep_time, label = TRUE)) %>% 
  filter(dep_delay >= 15 & origin == "EWR" & month == "Dec") %>%
  select(date, month, pressure, precip, temp, wind_speed, wind_dir, dewp, visib, humid) %>% 
  group_by(date) %>% 
  summarise(
    mean_pressure = mean(pressure, na.rm = TRUE),
    mean_precip = mean(precip, na.rm = TRUE),
    mean_temp = mean(temp, na.rm = TRUE),
    mean_wind_speed = mean(wind_speed, na.rm = TRUE),
    mean_wind_dir = mean(wind_dir, na.rm = TRUE),
    mean_dewp = mean(dewp, na.rm = TRUE),
    mean_visib = mean(visib, na.rm = TRUE),
    mean_humid = mean(humid, na.rm = TRUE)
  ) %>% 
  pivot_longer(
    cols = mean_pressure:mean_humid,
    names_to = "variable",
    values_to = "value"
  ) %>% 
  ggplot() +
  aes(x = date, y = value, colour = variable) +
  geom_line() +
  scale_colour_manual(values = cbPalette) +
  theme_bw()
Warning: Removed 8 row(s) containing missing values (geom_path).

flights_dt %>% 
  mutate(date = as.Date(dep_time, label = TRUE),
         month = month(dep_time, label = TRUE)) %>% 
  filter(dep_delay >= 15 & origin == "EWR" & month == "Dec") %>%
  select(date, dep_delay, month, pressure, precip, temp, wind_speed, wind_dir, dewp, visib, humid) %>% 
  group_by(date) %>% 
  summarise(
    departure_delay = mean(dep_delay),
    pressure = mean(pressure),
    precipitation = mean(precip),
    temperature = mean(temp),
    wind_speed = mean(wind_speed),
    wind_direction = mean(wind_dir),
    dewpoint = mean(dewp),
    visibility = mean(visib),
    humidity = mean(humid)
  ) %>% 
  na.omit() %>% 
  kable(align = "c") %>%
  kable_styling(full_width = FALSE) %>% 
  column_spec(1:10, color = "black")
date departure_delay pressure precipitation temperature wind_speed wind_direction dewpoint visibility humidity
2013-12-02 60.08537 1013.267 0.0000000 46.32317 1.684068 11.58537 33.83073 7.402439 62.29524
2013-12-03 46.37931 1013.555 0.0000000 48.27759 5.297556 176.55172 33.99241 8.275862 59.37724
2013-12-04 58.64286 1019.479 0.0000000 47.24857 3.074227 39.14286 39.51371 6.314286 74.70871
2013-12-11 50.72414 1024.549 0.0000000 29.61655 12.248532 234.48276 16.42483 10.000000 57.65954
2013-12-12 41.20000 1024.931 0.0000000 24.20825 11.234490 251.25000 6.60200 10.000000 46.63287
2013-12-13 48.45902 1023.211 0.0000000 31.33311 10.772055 247.21311 14.74656 10.000000 49.98475
2013-12-16 43.13000 1020.163 0.0000000 27.44420 11.116535 279.50000 9.73220 9.950000 46.96260
2013-12-18 41.73529 1019.113 0.0000000 31.42294 9.950862 252.54902 19.94529 9.950980 62.86186
2013-12-19 53.08904 1019.290 0.0000000 38.14096 5.777546 199.93151 26.13644 9.739726 62.29753
2013-12-20 56.01198 1016.354 0.0000000 45.38790 7.194098 207.42515 32.40527 9.952096 60.93689
2013-12-21 56.14516 1014.031 0.0004032 57.21452 7.081009 195.16129 48.57452 9.943548 73.58613
2013-12-24 41.00000 1021.422 0.0000000 36.45655 12.599057 317.75862 20.25966 10.000000 52.09621
2013-12-27 49.68468 1026.695 0.0000000 37.00757 8.159134 248.01802 19.18919 10.000000 48.95180
2013-12-28 36.03896 1020.871 0.0000000 45.39247 12.688470 228.83117 25.24182 10.000000 47.41364
flights_dt %>% 
  mutate(date = as.Date(dep_time, label = TRUE),
         month = month(dep_time, label = TRUE)) %>% 
  filter(dep_delay >= 15 & origin == "EWR" & month == "Dec") %>%
  select(date, dep_delay, month, pressure, precip, temp, wind_speed, wind_dir, dewp, visib, humid) %>% 
  group_by(date) %>% 
  summarise(
    departure_delay = scale(dep_delay),
    pressure = scale(pressure),
    precipitation = scale(precip),
    temperature = scale(temp),
    wind_speed = scale(wind_speed),
    wind_direction = scale(wind_dir),
    dewpoint = scale(dewp),
    visibility = scale(visib),
    humidity = scale(humid)
  ) %>% 
  na.omit() %>% 
  pivot_longer(
    cols = departure_delay:humidity,
    names_to = "variable",
    values_to = "value"
  ) %>% 
  ggplot() +
  aes(x = date, y = value, colour = variable) +
  geom_point(alpha = 0.8) +
  scale_colour_manual(values = cbPalette) +
  scale_x_date(labels = date_format("%d"), breaks = date_breaks("day")) +
  labs(
    colour = "",
    title = "Weather variables December"
  ) +
  theme_bw()
`summarise()` has grouped output by 'date'. You can override using the `.groups` argument.

What is the number of flights per month?

flights_dt %>%
  mutate(month = month(sched_dep_time, label = TRUE)) %>% 
  group_by(month, origin) %>% 
  summarise(no_of_flights = n(), .groups = "drop") %>% 
  ggplot() +
  aes(x = month, y = no_of_flights, fill = origin) +
  geom_col(position = "dodge", alpha = 0.8) +
  labs(
    x = "month",
    y = "number of departures",
    title = "Departure numbers by month",
    fill = "airport"
  ) +
  scale_fill_manual(values = cbPalette) +
  theme_bw()

Which carrier has the most departure delays?

flights_dt %>% 
  filter(dep_delay >= 15) %>% 
  group_by(carrier_name, origin) %>% 
  summarise(mean_delay = mean(dep_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
  geom_col(alpha = 0.8) +
  facet_wrap(~ origin) +
  labs(
    x = "carrier",
    y = "mean delay (minutes)",
    title = "Mean departure delay by carrier",
    fill = "airport"
  ) +
  theme_bw() +
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
  theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
  coord_flip()

Which carrier has the most arrival delays?

flights_dt %>% 
  filter(arr_delay >= 15) %>% 
  group_by(carrier_name, origin) %>% 
  summarise(mean_delay = mean(arr_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
  geom_col(alpha = 0.8) +
  facet_wrap(~ origin) +
  labs(
    x = "carrier",
    y = "mean delay (minutes)",
    title = "Mean arrival delay by carrier",
    fill = "airport"
  ) +
  theme_bw() +
  scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
  theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
  coord_flip()

Which season has the highest number of departure delays?

flights_dt %>% 
  filter(dep_delay >= 15) %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>% 
  ggplot() +
  aes(x = day, y = mean_delay, colour = origin) +
  geom_point(alpha = 0.8) +
  labs(
    x = "date",
    y = "mean delay (minutes)",
    title = "Mean departure delay by month"
  ) +
  scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
  theme_bw()

Over the course of a day when is the largest average delay?

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  select(dep_delay, hour) %>%
  group_by(hour) %>% 
  summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>% 
  ggplot() +
  aes(x = hour, y = mean_delay) +
  geom_point(alpha = 0.8, colour = "#56B4E9") +
  geom_smooth(se = FALSE, colour = "#E69F00") +
  labs(
    x = "hour",
    y = "mean delay (minutes)",
    title = "Mean departure delay by departure time"
  ) +
  theme_bw() +
  scale_x_continuous(limits = c(5, 23), breaks = seq(5, 23, by = 1))
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

How does distance of an outbound flight affect departure delays?

flights_dt %>% 
  filter(origin == "EWR") %>% 
  ggplot() +
  aes(x = distance) +
  geom_histogram(bins = 50) +
  theme_bw() +
  labs(title = "Distribution of flight distance")

positions <- c("<500mi", "500-1000mi", "1000-1500mi", "1500-2000mi", "2000-2500mi", "2500-3000mi",
               ">3000mi")

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  mutate(distance = case_when(
    distance <= 500 ~ "<500mi",
    distance > 500 & distance <= 1000 ~ "500-1000mi",
    distance > 1000 & distance <= 1500 ~ "1000-1500mi",
    distance > 1500 & distance <= 2000 ~ "1500-2000mi",
    distance > 2000 & distance <= 2500 ~ "2000-2500mi",
    distance > 2500 & distance <= 3000 ~ "2500-3000mi",
    distance > 3000 ~ ">3000mi"
  )) %>% 
  group_by(distance) %>% 
  summarise(mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = distance, y = mean_delay) +
  geom_col(fill = "#999999", alpha = 0.8) +
  labs(
    x = "distance (miles)",
    y = "mean departure delay (minutes)",
    title = "Departure delay by flight distance"
  ) +
  scale_x_discrete(limits = positions) +
  theme_bw()

Which day is the best day to travel from Newark Int.?

flights_dt %>%
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  mutate(weekday = wday(sched_dep_time, label = TRUE)) %>% 
  group_by(weekday) %>% 
  summarise(mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = weekday, y = mean_delay) +
  geom_col(fill = "#999999", alpha = 0.8) +
  labs(
    x = "weekday",
    y = "mean departure delay (minutes)",
    title = "Departure delay by weekday"
  ) +
  theme_bw()

Which destinations suffer from the longest delays?

flights_dt %>%
  drop_na(dest_name) %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(dest, dest_name) %>% 
  summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>% 
  arrange(desc(mean_delay)) %>% 
  head(10) %>% 
  ggplot() +
  aes(x = reorder(dest_name, mean_delay), y = mean_delay) +
  geom_col(fill = "#999999", alpha = 0.8) +
  labs(
    x = "destination",
    y = "mean delay (minutes)",
    title = "Destinations with longest delays"
  ) +
  theme_bw() +
  coord_flip()

Trend weather conditions against mean departure delays

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_visibility = mean(visib, na.rm = TRUE),
            mean_delay = mean(dep_delay), .groups = "drop") %>% 
  ggplot() +
  aes(x = mean_visibility, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean visibility (miles)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by visibility"
  ) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_wind_speed = mean(wind_speed, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_wind_speed, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean wind speed (mph)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by wind speed"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_wind_dir = mean(wind_dir, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_wind_dir, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean wind direction (degrees)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by wind direction"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_humidity = mean(humid, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_humidity, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean humidity (%)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by humidity"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_temp = mean(temp, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_temp, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean temperature (degf)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by temperature"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_dewpoint = mean(dewp, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_dewpoint, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean dewpoint (degF)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by dewpoint"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>% 
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_precip = mean(precip, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_precip, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean precipitation (inches)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by precipitation"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
  filter(dep_delay >= 15 & origin == "EWR") %>% 
  group_by(day = floor_date(sched_dep_time, "day"), origin) %>% 
  summarise(mean_pressure = mean(pressure, na.rm = TRUE),
            mean_delay = mean(dep_delay)) %>% 
  ggplot() +
  aes(x = mean_pressure, y = mean_delay) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
  labs(
    x = "mean pressure (mbar)",
    y = "mean departure delay (minutes)",
    title = "Mean departure delay by pressure"
  ) +
  theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgQW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CnBhY21hbjo6cF9sb2FkKAogIHRpZHl2ZXJzZSwKICBoZXJlLAogIFJDb2xvckJyZXdlciwKICBsdWJyaWRhdGUsCiAgc2NhbGVzLAogIEdHYWxseSwKICBzdGF0cywKICBjb3JycGxvdCwKICBsZWFwcywKICBnbG11bHRpLAogIGJyb29tLAogIHJwYXJ0LAogIHJwYXJ0LnBsb3QsCiAgbW9kZWxyLAogIHlhcmRzdGljaywKICBjYXJldCwKICByYW5nZXIsCiAga2FibGVFeHRyYQopCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KZmxpZ2h0c19kdCA8LSByZWFkX2NzdihoZXJlKCJjbGVhbl9kYXRhL2ZsaWdodHNfY2xlYW4uY3N2IikpCgpjYlBhbGV0dGUgPC0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiLCAiIzAwOUU3MyIsICIjRjBFNDQyIiwgIiMwMDcyQjIiLCAiI0Q1NUUwMCIsICIjQ0M3OUE3IiwgIiMwMDAwMDAiKQoKc3VtbWFyeShmbGlnaHRzX2R0KQpgYGAKCiMgV2hpY2ggYWlycG9ydCBpbiBvdXIgZGF0YXNldCBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlcGFydHVyZXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZ3JvdXBfYnkob3JpZ2luKSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBvcmlnaW4sIGZpbGwgPSBvcmlnaW4pICsKICBnZW9tX2JhcihhbHBoYSA9IDAuOCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIGxhYnMoCiAgICB4ID0gImFpcnBvcnQiLAogICAgeSA9ICJkZXBhcnR1cmUgbnVtYmVycyIsCiAgICB0aXRsZSA9ICJEZXBhcnR1cmUgbnVtYmVycyBieSBhaXJwb3J0IgogICkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hhdCBpcyB0aGUgdHJlbmQgb2YgZGVsYXlzIG92ZXIgdGhlIHllYXIsIGhvdyBkb2VzIGl0IGNvbXBhcmUgYWNyb3NzIHRoZSB0aHJlZSBhaXJwb3J0cz8KCmBgYHtyLHdhcm5pbmc9RkFMU0V9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1vbnRoLCB5ID0gbWVhbl9kZWxheSwgY29sb3VyID0gb3JpZ2luKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC42KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIm1vbnRoIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIiBNZWFuIGRlbGF5IGJ5IG1vbnRoIiwKICAgIGNvbG91ciA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lX2J3KCkKYGBgCiMgV2hpY2ggbW9udGhzIGhhdmUgdGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KIyBoaWdoZXN0IG1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IG1vbnRoCmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UoZGVzYyhtZWFuX2RlbGF5KSkKYGBgCgpgYGB7cn0KIyBsb3dlc3QgZGVwYXJ0dXJlIGRlbGF5IGJ5IG1vbnRoCmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UobWVhbl9kZWxheSkKYGBgCgojIFdoYXQgaXMgdGhlIG51bWJlciBvZiBkZWxheWVkIGZsaWdodHMgb3ZlciB0aGUgeWVhcj8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2Uobm9fb2ZfZGVsYXlzID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBub19vZl9kZWxheXMsIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fbGluZShhbHBoYSA9IDAuNikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJtb250aCIsCiAgICB5ID0gIm51bWJlciBvZiBkZWxheXMiLAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIGRlbGF5ZWQgZmxpZ2h0cyBieSBtb250aCIsCiAgICBjb2xvdXIgPSAiYWlycG9ydCIKICApICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IikpICsKICB0aGVtZV9idygpCmBgYAojIFdoaWNoIG1vbnRoIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KG1vbnRoID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgIm1vbnRoIiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShub19vZl9kZWxheXMgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBhcnJhbmdlKGRlc2Mobm9fb2ZfZGVsYXlzKSkKYGBgCgojIFdoYXQgd2VyZSB0aGUgd2VhdGhlciBjb25kaXRpb25zIGR1cmluZyB0aGVzZSBtb250aHM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRlcF90aW1lLCBsYWJlbCA9IFRSVUUpLAogICAgICAgICBtb250aCA9IG1vbnRoKGRlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIiAmIG1vbnRoID09ICJEZWMiKSAlPiUKICBzZWxlY3QoZGF0ZSwgbW9udGgsIHByZXNzdXJlLCBwcmVjaXAsIHRlbXAsIHdpbmRfc3BlZWQsIHdpbmRfZGlyLCBkZXdwLCB2aXNpYiwgaHVtaWQpICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbWVhbl9wcmVzc3VyZSA9IG1lYW4ocHJlc3N1cmUsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX3ByZWNpcCA9IG1lYW4ocHJlY2lwLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl90ZW1wID0gbWVhbih0ZW1wLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl93aW5kX3NwZWVkID0gbWVhbih3aW5kX3NwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl93aW5kX2RpciA9IG1lYW4od2luZF9kaXIsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX2Rld3AgPSBtZWFuKGRld3AsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX3Zpc2liID0gbWVhbih2aXNpYiwgbmEucm0gPSBUUlVFKSwKICAgIG1lYW5faHVtaWQgPSBtZWFuKGh1bWlkLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IG1lYW5fcHJlc3N1cmU6bWVhbl9odW1pZCwKICAgIG5hbWVzX3RvID0gInZhcmlhYmxlIiwKICAgIHZhbHVlc190byA9ICJ2YWx1ZSIKICApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkYXRlLCB5ID0gdmFsdWUsIGNvbG91ciA9IHZhcmlhYmxlKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGVwX3RpbWUsIGxhYmVsID0gVFJVRSksCiAgICAgICAgIG1vbnRoID0gbW9udGgoZGVwX3RpbWUsIGxhYmVsID0gVFJVRSkpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiICYgbW9udGggPT0gIkRlYyIpICU+JQogIHNlbGVjdChkYXRlLCBkZXBfZGVsYXksIG1vbnRoLCBwcmVzc3VyZSwgcHJlY2lwLCB0ZW1wLCB3aW5kX3NwZWVkLCB3aW5kX2RpciwgZGV3cCwgdmlzaWIsIGh1bWlkKSAlPiUgCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIAogIHN1bW1hcmlzZSgKICAgIGRlcGFydHVyZV9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwKICAgIHByZXNzdXJlID0gbWVhbihwcmVzc3VyZSksCiAgICBwcmVjaXBpdGF0aW9uID0gbWVhbihwcmVjaXApLAogICAgdGVtcGVyYXR1cmUgPSBtZWFuKHRlbXApLAogICAgd2luZF9zcGVlZCA9IG1lYW4od2luZF9zcGVlZCksCiAgICB3aW5kX2RpcmVjdGlvbiA9IG1lYW4od2luZF9kaXIpLAogICAgZGV3cG9pbnQgPSBtZWFuKGRld3ApLAogICAgdmlzaWJpbGl0eSA9IG1lYW4odmlzaWIpLAogICAgaHVtaWRpdHkgPSBtZWFuKGh1bWlkKQogICkgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgCiAgY29sdW1uX3NwZWMoMToxMCwgY29sb3IgPSAiYmxhY2siKQpgYGAgIAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkZXBfdGltZSwgbGFiZWwgPSBUUlVFKSwKICAgICAgICAgbW9udGggPSBtb250aChkZXBfdGltZSwgbGFiZWwgPSBUUlVFKSkgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIgJiBtb250aCA9PSAiRGVjIikgJT4lCiAgc2VsZWN0KGRhdGUsIGRlcF9kZWxheSwgbW9udGgsIHByZXNzdXJlLCBwcmVjaXAsIHRlbXAsIHdpbmRfc3BlZWQsIHdpbmRfZGlyLCBkZXdwLCB2aXNpYiwgaHVtaWQpICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgZGVwYXJ0dXJlX2RlbGF5ID0gc2NhbGUoZGVwX2RlbGF5KSwKICAgIHByZXNzdXJlID0gc2NhbGUocHJlc3N1cmUpLAogICAgcHJlY2lwaXRhdGlvbiA9IHNjYWxlKHByZWNpcCksCiAgICB0ZW1wZXJhdHVyZSA9IHNjYWxlKHRlbXApLAogICAgd2luZF9zcGVlZCA9IHNjYWxlKHdpbmRfc3BlZWQpLAogICAgd2luZF9kaXJlY3Rpb24gPSBzY2FsZSh3aW5kX2RpciksCiAgICBkZXdwb2ludCA9IHNjYWxlKGRld3ApLAogICAgdmlzaWJpbGl0eSA9IHNjYWxlKHZpc2liKSwKICAgIGh1bWlkaXR5ID0gc2NhbGUoaHVtaWQpCiAgKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gZGVwYXJ0dXJlX2RlbGF5Omh1bWlkaXR5LAogICAgbmFtZXNfdG8gPSAidmFyaWFibGUiLAogICAgdmFsdWVzX3RvID0gInZhbHVlIgogICkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRhdGUsIHkgPSB2YWx1ZSwgY29sb3VyID0gdmFyaWFibGUpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44KSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVkIiksIGJyZWFrcyA9IGRhdGVfYnJlYWtzKCJkYXkiKSkgKwogIGxhYnMoCiAgICBjb2xvdXIgPSAiIiwKICAgIHRpdGxlID0gIldlYXRoZXIgdmFyaWFibGVzIERlY2VtYmVyIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoYXQgaXMgdGhlIG51bWJlciBvZiBmbGlnaHRzIHBlciBtb250aD8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIG11dGF0ZShtb250aCA9IG1vbnRoKHNjaGVkX2RlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZ3JvdXBfYnkobW9udGgsIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShub19vZl9mbGlnaHRzID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBub19vZl9mbGlnaHRzLCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIm1vbnRoIiwKICAgIHkgPSAibnVtYmVyIG9mIGRlcGFydHVyZXMiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIG51bWJlcnMgYnkgbW9udGgiLAogICAgZmlsbCA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoaWNoIGNhcnJpZXIgaGFzIHRoZSBtb3N0IGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSkgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXJfbmFtZSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGNhcnJpZXJfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5LCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAwLjgpICsKICBmYWNldF93cmFwKH4gb3JpZ2luKSArCiAgbGFicygKICAgIHggPSAiY2FycmllciIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IGNhcnJpZXIiLAogICAgZmlsbCA9ICJhaXJwb3J0IgogICkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMgV2hpY2ggY2FycmllciBoYXMgdGhlIG1vc3QgYXJyaXZhbCBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGFycl9kZWxheSA+PSAxNSkgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXJfbmFtZSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGFycl9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGNhcnJpZXJfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5LCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAwLjgpICsKICBmYWNldF93cmFwKH4gb3JpZ2luKSArCiAgbGFicygKICAgIHggPSAiY2FycmllciIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gYXJyaXZhbCBkZWxheSBieSBjYXJyaWVyIiwKICAgIGZpbGwgPSAiYWlycG9ydCIKICApICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMSkpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIFdoaWNoIHNlYXNvbiBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSkgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRheSwgeSA9IG1lYW5fZGVsYXksIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJkYXRlIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgbW9udGgiCiAgKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIpKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgT3ZlciB0aGUgY291cnNlIG9mIGEgZGF5IHdoZW4gaXMgdGhlIGxhcmdlc3QgYXZlcmFnZSBkZWxheT8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgc2VsZWN0KGRlcF9kZWxheSwgaG91cikgJT4lCiAgZ3JvdXBfYnkoaG91cikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBob3VyLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgsIGNvbG91ciA9ICIjNTZCNEU5IikgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gImhvdXIiLAogICAgeSA9ICJtZWFuIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBkZXBhcnR1cmUgdGltZSIKICApICsKICB0aGVtZV9idygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyg1LCAyMyksIGJyZWFrcyA9IHNlcSg1LCAyMywgYnkgPSAxKSkKYGBgCiMgSG93IGRvZXMgZGlzdGFuY2Ugb2YgYW4gb3V0Ym91bmQgZmxpZ2h0IGFmZmVjdCBkZXBhcnR1cmUgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkaXN0YW5jZSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZsaWdodCBkaXN0YW5jZSIpCmBgYAoKYGBge3J9CnBvc2l0aW9ucyA8LSBjKCI8NTAwbWkiLCAiNTAwLTEwMDBtaSIsICIxMDAwLTE1MDBtaSIsICIxNTAwLTIwMDBtaSIsICIyMDAwLTI1MDBtaSIsICIyNTAwLTMwMDBtaSIsCiAgICAgICAgICAgICAgICI+MzAwMG1pIikKCmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBtdXRhdGUoZGlzdGFuY2UgPSBjYXNlX3doZW4oCiAgICBkaXN0YW5jZSA8PSA1MDAgfiAiPDUwMG1pIiwKICAgIGRpc3RhbmNlID4gNTAwICYgZGlzdGFuY2UgPD0gMTAwMCB+ICI1MDAtMTAwMG1pIiwKICAgIGRpc3RhbmNlID4gMTAwMCAmIGRpc3RhbmNlIDw9IDE1MDAgfiAiMTAwMC0xNTAwbWkiLAogICAgZGlzdGFuY2UgPiAxNTAwICYgZGlzdGFuY2UgPD0gMjAwMCB+ICIxNTAwLTIwMDBtaSIsCiAgICBkaXN0YW5jZSA+IDIwMDAgJiBkaXN0YW5jZSA8PSAyNTAwIH4gIjIwMDAtMjUwMG1pIiwKICAgIGRpc3RhbmNlID4gMjUwMCAmIGRpc3RhbmNlIDw9IDMwMDAgfiAiMjUwMC0zMDAwbWkiLAogICAgZGlzdGFuY2UgPiAzMDAwIH4gIj4zMDAwbWkiCiAgKSkgJT4lIAogIGdyb3VwX2J5KGRpc3RhbmNlKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkaXN0YW5jZSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gImRpc3RhbmNlIChtaWxlcykiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIGRlbGF5IGJ5IGZsaWdodCBkaXN0YW5jZSIKICApICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHBvc2l0aW9ucykgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoaWNoIGRheSBpcyB0aGUgYmVzdCBkYXkgdG8gdHJhdmVsIGZyb20gTmV3YXJrIEludC4/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgbXV0YXRlKHdlZWtkYXkgPSB3ZGF5KHNjaGVkX2RlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZ3JvdXBfYnkod2Vla2RheSkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gd2Vla2RheSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIndlZWtkYXkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIGRlbGF5IGJ5IHdlZWtkYXkiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hpY2ggYXJlIHRoZSBtb3N0IHBvcHVsYXIgZGVzdGluYXRpb25zIGZyb20gTmV3YXJrIEludD8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIob3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGVzdCwgZGVzdF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lIAogIGhlYWQoMTApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGRlc3RfbmFtZSwgY291bnQpLCB5ID0gY291bnQpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gImRlc3RpbmF0aW9uIiwKICAgIHkgPSAibnVtYmVyIG9mIGZsaWdodHMgcGVyIHllYXIiLAogICAgdGl0bGUgPSAiRGVzdGluYXRpb25zIGZyb20gTmV3YXJrIEludC4iCiAgKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBXaGljaCBkZXN0aW5hdGlvbnMgc3VmZmVyIGZyb20gdGhlIGxvbmdlc3QgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZHJvcF9uYShkZXN0X25hbWUpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGVzdCwgZGVzdF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UoZGVzYyhtZWFuX2RlbGF5KSkgJT4lIAogIGhlYWQoMTApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGRlc3RfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9jb2woZmlsbCA9ICIjOTk5OTk5IiwgYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJkZXN0aW5hdGlvbiIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIkRlc3RpbmF0aW9ucyB3aXRoIGxvbmdlc3QgZGVsYXlzIgogICkgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMgVHJlbmQgd2VhdGhlciBjb25kaXRpb25zIGFnYWluc3QgbWVhbiBkZXBhcnR1cmUgZGVsYXlzCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fdmlzaWJpbGl0eSA9IG1lYW4odmlzaWIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3Zpc2liaWxpdHksIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gdmlzaWJpbGl0eSAobWlsZXMpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHZpc2liaWxpdHkiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl93aW5kX3NwZWVkID0gbWVhbih3aW5kX3NwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl93aW5kX3NwZWVkLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHdpbmQgc3BlZWQgKG1waCkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgd2luZCBzcGVlZCIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3dpbmRfZGlyID0gbWVhbih3aW5kX2RpciwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1lYW5fd2luZF9kaXIsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gd2luZCBkaXJlY3Rpb24gKGRlZ3JlZXMpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHdpbmQgZGlyZWN0aW9uIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9odW1pZGl0eSA9IG1lYW4oaHVtaWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX2h1bWlkaXR5LCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIGh1bWlkaXR5ICglKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBodW1pZGl0eSIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3RlbXAgPSBtZWFuKHRlbXAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3RlbXAsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gdGVtcGVyYXR1cmUgKGRlZ2YpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHRlbXBlcmF0dXJlIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGV3cG9pbnQgPSBtZWFuKGRld3AsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX2Rld3BvaW50LCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIGRld3BvaW50IChkZWdGKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBkZXdwb2ludCIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3ByZWNpcCA9IG1lYW4ocHJlY2lwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl9wcmVjaXAsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gcHJlY2lwaXRhdGlvbiAoaW5jaGVzKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBwcmVjaXBpdGF0aW9uIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9wcmVzc3VyZSA9IG1lYW4ocHJlc3N1cmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3ByZXNzdXJlLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHByZXNzdXJlIChtYmFyKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBwcmVzc3VyZSIKICApICsKICB0aGVtZV9idygpCmBgYAoKCgo=